/* Include these
   #include <rid.h>
   #include <stdint.h>

   #include <nit/list.h>
   #include <nit/set.h>
   #include <nit/map.h>
   #include <nit/buf.h>
   #include <nit/gap.h>
*/

typedef struct Aas_rule Aas_rule;

struct Aas_rule {
	Aas_rule *next;
	Rid id;
	Rid add_id;
	Nit_gap vals;
};

typedef struct {
	Aas_rule *rules;
	Nit_map vals;
} Aas_set;

Aas_rule *
aas_rule_new(const Rid id, const Rid add_id, int64_t size);

void
aas_rule_free(Aas_rule *rule);

int
aas_rule_add(Aas_rule *rule, const Rid id);

int
aas_rule_remove(Aas_rule *rule, const Rid id);

int
aas_rule_same(Aas_rule *rule1, Aas_rule *rule2);

int
aas_set_init(Aas_set *set, Aas_rule *rules, unsigned int sequence);

void
aas_set_dispose(Aas_set *set, Nit_entry **entries);

Aas_set *
aas_set_new(Aas_rule *rules, unsigned int sequence);

void
aas_set_free(Aas_set *set, Nit_entry **entries);

int
aas_set_rule(Aas_set *set, Aas_rule *rule, Nit_entry **entries);

Aas_rule *
aas_set_unrule(Aas_set *set, const Rid id, Nit_entry **entries);

int
aas_set_add(Aas_set *set, const Rid id, const Rid rule_id, Nit_entry **entries);

void
aas_set_remove(Aas_set *set, const Rid id, const Rid rule_id,
	       Nit_entry **entries);

Aas_rule *
aas_set_match_rule(Aas_set *set, Aas_rule *rule);

Aas_rule *
aas_set_get_rule(Aas_set *set, const Rid id);

static inline int
aas_set_contains(Aas_set *set, const Rid id)
{
	return nit_set_contains(&set->vals, id, sizeof(Rid));
}
